//SPDX-FileCopyrightText: Copyright 2022-2024 深圳市同心圆网络有限公司
//SPDX-License-Identifier: GPL-3.0-only

package appstore_api_serv

import (
	"context"

	"atomgit.com/openlinksaas/api-server/dao/appstore_dao"
	"atomgit.com/openlinksaas/proto-gen-go.git/appstore_api"
)

func (apiImpl *AppstoreApiImpl) ListMajorCate(ctx context.Context, req *appstore_api.ListMajorCateRequest) (*appstore_api.ListMajorCateResponse, error) {
	cateItemList, err := appstore_dao.CateDao.List(ctx, "", appstore_dao.CATE_LEVEL_MAJOR)
	if err != nil {
		return nil, err
	}

	cateInfoList := []*appstore_api.MajorCate{}
	for _, cateItem := range cateItemList {
		cateInfoList = append(cateInfoList, &appstore_api.MajorCate{
			CateId:         cateItem.CateId,
			CateName:       cateItem.CateName,
			MinorCateCount: cateItem.ChildCount,
		})
	}

	return &appstore_api.ListMajorCateResponse{
		Code:         appstore_api.ListMajorCateResponse_CODE_OK,
		CateInfoList: cateInfoList,
	}, nil
}

func (apiImpl *AppstoreApiImpl) ListMinorCate(ctx context.Context, req *appstore_api.ListMinorCateRequest) (*appstore_api.ListMinorCateResponse, error) {
	emptyList := []*appstore_api.MinorCate{}

	exist, err := appstore_dao.CateDao.Exist(ctx, req.MajorCateId, appstore_dao.CATE_LEVEL_MAJOR)
	if err != nil {
		return nil, err
	}
	if !exist {
		return &appstore_api.ListMinorCateResponse{
			Code:         appstore_api.ListMinorCateResponse_CODE_NO_MAJOR_CATE,
			ErrMsg:       "一级分类不存在",
			CateInfoList: emptyList,
		}, nil
	}
	cateItemList, err := appstore_dao.CateDao.List(ctx, req.MajorCateId, appstore_dao.CATE_LEVEL_MINOR)
	if err != nil {
		return nil, err
	}
	cateInfoList := []*appstore_api.MinorCate{}
	for _, cateItem := range cateItemList {
		cateInfoList = append(cateInfoList, &appstore_api.MinorCate{
			CateId:            cateItem.CateId,
			CateName:          cateItem.CateName,
			SubMinorCateCount: cateItem.ChildCount,
		})
	}
	return &appstore_api.ListMinorCateResponse{
		Code:         appstore_api.ListMinorCateResponse_CODE_OK,
		CateInfoList: cateInfoList,
	}, nil
}

func (apiImpl *AppstoreApiImpl) ListSubMinorCate(ctx context.Context, req *appstore_api.ListSubMinorCateRequest) (*appstore_api.ListSubMinorCateResponse, error) {
	emptyList := []*appstore_api.SubMinorCate{}

	exist, err := appstore_dao.CateDao.Exist(ctx, req.MinorCateId, appstore_dao.CATE_LEVEL_MINOR)
	if err != nil {
		return nil, err
	}
	if !exist {
		return &appstore_api.ListSubMinorCateResponse{
			Code:         appstore_api.ListSubMinorCateResponse_CODE_NO_MINOR_CATE,
			ErrMsg:       "二级分类不存在",
			CateInfoList: emptyList,
		}, nil
	}
	cateItemList, err := appstore_dao.CateDao.List(ctx, req.MinorCateId, appstore_dao.CATE_LEVEL_SUB_MINOR)
	if err != nil {
		return nil, err
	}
	cateInfoList := []*appstore_api.SubMinorCate{}
	for _, cateItem := range cateItemList {
		cateInfoList = append(cateInfoList, &appstore_api.SubMinorCate{
			CateId:   cateItem.CateId,
			CateName: cateItem.CateName,
		})
	}
	return &appstore_api.ListSubMinorCateResponse{
		Code:         appstore_api.ListSubMinorCateResponse_CODE_OK,
		CateInfoList: cateInfoList,
	}, nil
}

func (apiImpl *AppstoreApiImpl) GetCatePath(ctx context.Context, req *appstore_api.GetCatePathRequest) (*appstore_api.GetCatePathResponse, error) {
	emptyInfo := &appstore_api.CatePath{}

	cateIdList := []string{}
	cateId := req.CateId
	for i := 0; i < 3; i++ { //防止死循环
		if cateId == "" {
			break
		}
		tmpCateIdList := []string{cateId}
		tmpCateIdList = append(tmpCateIdList, cateIdList...)
		cateIdList = tmpCateIdList
		cateItem, err := appstore_dao.CateDao.GetWithoutLevel(ctx, cateId)
		if err != nil {
			return &appstore_api.GetCatePathResponse{
				Code:     appstore_api.GetCatePathResponse_CODE_NO_CATE,
				ErrMsg:   "分类不存在",
				CatePath: emptyInfo,
			}, nil
		}
		cateId = cateItem.ParentCateId
	}
	pathInfo := &appstore_api.CatePath{}
	for index, cateId := range cateIdList {
		if index == 0 {
			pathInfo.MajorCateId = cateId
		} else if index == 1 {
			pathInfo.MinorCateId = cateId
		} else if index == 2 {
			pathInfo.SubMinorCateId = cateId
		}
	}
	return &appstore_api.GetCatePathResponse{
		Code:     appstore_api.GetCatePathResponse_CODE_OK,
		CatePath: pathInfo,
	}, nil
}
